package com.zjl.legendary.service.impl;

import com.zjl.legendary.dao.TaskItemDao;
import com.zjl.legendary.dao.UserTaskDao;
import com.zjl.legendary.dto.TaskQuestionDto;
import com.zjl.legendary.entity.TaskItem;
import com.zjl.legendary.service.intf.TaskItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 任务详情Service层实现类
 * @author zhoujingluo
 * @date 2021/5/29 21:31
 */
@Service
@Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,
        readOnly = false,rollbackFor = Exception.class)
public class TaskItemServiceImpl implements TaskItemService {
    @Autowired
    private TaskItemDao taskItemDao;
    @Autowired
    private UserTaskDao userTaskDao;

    /**
     * 根据任务id查询任务详情
     * @param tid
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    public List<TaskQuestionDto> queryByTid(Integer tid) {
        return taskItemDao.selectByTid(tid);
    }

    /**
     * 批量添加任务详情
     * @param tilist 进行批量导入的任务详情集合
     * @return 返回执行结果
     */
    @Override
    public boolean saveBatch(List<TaskItem> tilist) {
        return taskItemDao.insertBatch(tilist) > 0;
    }

    /**
     * 用户进行任务测试
     * 用户完成测试需要保存用户的答案，以及修改任务状态
     * 用户完成答题，则修改对应任务详情的状态，用户答案为空则不对任务详情进行修改
     * 只有当题全部完成才会修改任务状态
     * @param tid 任务id
     * @param ids 任务详情id的数组
     * @param uanswers 用户答案的数组
     * @return 返回是否成功完成测试
     */
    @Override
    public boolean test(String tid, String[] ids, String[] uanswers) {
        //遍历参数数组
        for (int i = 0;i < ids.length;i++){
            if (taskItemDao.updateUanswer(Integer.valueOf(ids[i]),uanswers[i]) <= 0){
                return false;
            }
        }
        //更改任务状态
        return userTaskDao.update(Integer.valueOf(tid),2) > 0;
    }
}
